package com.shujia.day02;

/*
    常量：在java程序运行过程中其值不能发生改变的量

    分类：
        1、字面值常量
            整数常量 表示所有的整数，包括负数  10  -8
            小数常量 表示所有的小数 1.23  -3.14
            布尔常量 true  false
            空常量 null
            字符常量 表示由单引号括起来的单个字符 'a' '刘'
        2、自定义常量【放到面向对象的时候讲解】

   常见的单位转换：
        1byte = 8bit
        1kb = 1024byte
        1mb = 1024kb
        1gb = 1024mb
        1tb = 1024gb
        1pb = 1024tb

   整数10的二进制表现形式：00001010

   java针对整数常量，提供4种表现形式：
        二进制：由0，1构成，逢2进1，由0b开头
        八进制：由0，1，2，3，4，5，6，7构成，逢8进1，由0开头
        十进制：由0，1，2，3，4，5，6，7，8，9构成，逢10进1，默认就是10进制
        十六进制：由0，1，2，3，4，5，6，7，8，9，a,b,c,d,e,f构成，逢16进1，由0x开头

   进制之间的转换：
        1、其它进制转10进制 规律：每一位上的系数乘上自身进制的幂次方之和
            12345【10进制】 -> 【10进制】？12345
            12345 = 10000 + 2000 + 300 +40 + 5
                  = 1*10^4 + 2*10^3 + 3*10^2 + 4*10^1 + 5*10^0
                  = 10000 + 2000 + 300 + 40 + 5
                  = 12345

        2、10进制转其它进制 规律：除基取余，直到商为0，余数翻转
           需求：把52分别表示成二进制，八进制，十六进制

        3、10进制与2进制之间的快速转换：8421码

           1    1   1   1   1   1   1   1
          128  64   32  16  8   4   2   1


          10110011 -> 128 + 32 + 16 + 2 + 1

        4、其它进制到其它进制 举例：2进制转8进制
            方案1：先转10进制，再转目标进制
                10011-> 16 + 2 + 1 = 19
                19/8= 2...3
                2/8 = 0...2
            方案2：先转2进制，若转8进制，每3位一组合，转10进制拼接；若转16进制，每4位一组合，转10进制拼接
                举例：10011【2进制】 -> 【8进制】023
                        010-> 2   011-> 3
                     10011【2进制】 -> 【16进制】0x13
                        0001-> 1   0011-> 3

        举例：-7 + 3 = -4
        java针对2进制而言，负数和正数的表现形式不一样的，并且在计算机底层计算过程中，数据都是采用补码进行计算的
        要想知道一个数值的补码，就必须先知道该数值的反码，要想知道一个数值的反码，就必须先知道该数值的原码。
            原码：
                正数的原码与二进制值保持一致，最高位为0；
                负数的原码数值位与正数一致，最高位是1。
                举例：
                               符号位   数值位
                        -7的原码：1     0000111
                        3的原码： 0     0000011
            反码：
                正数的反码与原码保持一致；
                负数的反码，再原码的基础上，符号位不变，数值位按位取反
                举例：
                               符号位   数值位
                        -7的反码：1     1111000
                        3的反码： 0     0000011
            补码：
                正数的补码与原码保持一致；
                负数的补码，再反码的基础之上，末位+1
                举例：
                               符号位   数值位
                        -7的补码：1     1111001
                        3的补码： 0     0000011

                    11111001
                +
                    00000011
                  --------------
            补码：   11111100
            最终计算机是最终原码转10进制之后的结果
                    符号位    数值位
            补码：    1      1111100
            反码：    1      1111011
            原码：    1      0000100
            -------------------------
                     -4






 */
public class ConstantDemo1 {
    public static void main(String[] args) {
//        System.out.println(10);
//        System.out.println(3.14);
//        System.out.println(true);
//        System.out.println('a'); // 字符
//        System.out.println("qwe"); // 字符串

        //需求：输出不同进制下的100
        //java控制台中默认输出的整数结果都是转10进制之后的结果
        System.out.println(0b100); // 1*2^2 = 4
        System.out.println(0100); // 1*8^2 = 64
        System.out.println(100); // 100
        System.out.println(0x100); // 1*16^2 = 256
    }
}
